package controller;

import java.util.ArrayList;
import java.util.List;

import model.entidades.Convenio;
import model.entidades.Usuario;
import model.repositorio.ConvenioDAO;
import model.repositorio.DadosProfissionalDAO;
import model.repositorio.UsuarioDAO;
import utils.Criptografia;
import utils.Validacao;
import view.profissional.TelaCadastrarProfissional;

public class ControladorProfissional {

	private TelaCadastrarProfissional tela;

	private UsuarioDAO usuarioDAO;

	final boolean VALIDO = false;
	final boolean INVALIDO = true;

	private DadosProfissionalDAO dadosProfissionalDAO;

	public ControladorProfissional(TelaCadastrarProfissional tela) {
		this.tela = tela;
		usuarioDAO = new UsuarioDAO();
		dadosProfissionalDAO = new DadosProfissionalDAO();
	}

	public void salvar(Usuario usuario) throws ControladorExcecao {
		
		Convenio convenioParticular = new ConvenioDAO().buscaPorNomeExibicao("PARTICULAR");
		List<Convenio> listaConvenios = new ArrayList<Convenio>();
		listaConvenios.add(convenioParticular);
		
		int contaErros = 0;
		if (usuario == null) {
			throw new ControladorExcecao(ControladorExcecao.USUARIO_NULO);
		} else {
			
			if(tela.getComboBoxHoraInicio().getSelectedIndex() >= tela.getComboBoxHoraFim().getSelectedIndex()){
				tela.mostraCampoInvalido(tela.getLblHorarioAtendimento(), INVALIDO);
				tela.mostraCampoInvalido(tela.getLblInicio(), INVALIDO);
				tela.mostraCampoInvalido(tela.getLblFim(), INVALIDO);
				throw new ControladorExcecao(ControladorExcecao.HORARIO_INVALIDO);
			} else {
				tela.mostraCampoInvalido(tela.getLblHorarioAtendimento(), VALIDO);
				tela.mostraCampoInvalido(tela.getLblInicio(), VALIDO);
				tela.mostraCampoInvalido(tela.getLblFim(), VALIDO);
			}

			String confirmaSenha = Criptografia.criptografaSenha(new String (tela.getTxtConfirmaSenha().getPassword()));

			if(usuario.getID() == 0 || usuario.getSenha().length() > 0){
				if(usuario.getSenha().length() > 0 ){
					tela.mostraCampoInvalido(tela.getLblSenha(), VALIDO);
					if(usuario.getSenha().equals(confirmaSenha)){
						tela.mostraCampoInvalido(tela.getLblConfirmacaoSenha(), VALIDO);
					} else {
						tela.mostraCampoInvalido(tela.getLblConfirmacaoSenha(), INVALIDO);
						throw new ControladorExcecao(ControladorExcecao.SENHAS_DIVERGENTE);
					}
				} else {
					contaErros++;
					tela.mostraCampoInvalido(tela.getLblSenha(), INVALIDO);
				}
			}
			
			if (usuario.getNome() != null && usuario.getNome().length() > 2) {
				tela.mostraCampoInvalido(tela.getLblNomeCompleto(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblNomeCompleto(), INVALIDO);
			}

			if (usuario.getDataNascimento() != null) {
				tela.mostraCampoInvalido(tela.getLblDataNascimento(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblDataNascimento(), INVALIDO);
			}

			if (usuario.getCpf() != null && usuario.getCpf().length() == 11) {
				tela.mostraCampoInvalido(tela.getLblCpf(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblCpf(), INVALIDO);
			}

			if (usuario.getDadosProfissional().getEspecialidade() != null && usuario.getDadosProfissional().getEspecialidade().length() > 0) {
				tela.mostraCampoInvalido(tela.getLblEspecialidade(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblEspecialidade(), INVALIDO);
			}

			if (usuario.getDadosProfissional().getCrm() != null && usuario.getDadosProfissional().getCrm().length() >= 3 && tela.getComboBoxCrmUF().getSelectedIndex() != 0) {
				tela.mostraCampoInvalido(tela.getLblCrm(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblCrm(), INVALIDO);
			}

			if (usuario.getLogin() != null && usuario.getLogin().length() > 0) {
				tela.mostraCampoInvalido(tela.getLblLogin(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblLogin(), INVALIDO);
			}

			if (usuario.getEmail().length() > 0 && !Validacao.verificaEmail(usuario.getEmail())) {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblEmail(), INVALIDO);
			} else {
				tela.mostraCampoInvalido(tela.getLblEmail(), VALIDO);
			}
		}

		if (contaErros > 0) {
			throw new ControladorExcecao(ControladorExcecao.ERRO_VALIDACAO);
		} else {
			Usuario usuarioTesteCPF = usuarioDAO.buscaPorCPF(usuario.getCpf());
			Usuario usuarioTesteLogin = usuarioDAO.buscaPorLogin(usuario.getLogin());
			if(usuarioTesteCPF == null || usuarioTesteCPF.getID() == usuario.getID()) {
				if(usuarioTesteLogin == null || usuarioTesteLogin.getID() == usuario.getID()) {
					usuario.setConveniosAtendidos(listaConvenios);
					dadosProfissionalDAO.salvar(usuario.getDadosProfissional());
					usuarioDAO.salvar(usuario);
				} else {
					tela.mostraCampoInvalido(tela.getLblLogin(), INVALIDO);
					throw new ControladorExcecao(ControladorExcecao.LOGIN_USUARIO_CADASTRADO);
				}
			} else {
				tela.mostraCampoInvalido(tela.getLblCpf(), INVALIDO);
				throw new ControladorExcecao(ControladorExcecao.CPF_USUARIO_CADASTRADO);
			}			
		}
	}

}